接下來想要介紹的是index的其他用法
對於資料庫來說,index就是將原本資料表中的某些欄位排序的內容
所以這些index如果搜尋的欄位都有的狀況下,也能提升某種程度的效率
附上文章內的圖片
在這張圖中可以看到,如果我只針對第一個欄位增加index,那第二個條件的like在比對的時候,每一筆資料我都要花一個random io來把原本的資料讀出來比對
但如果我同時建立了兩個index,此時,我在取得index的時候就可以同時比對第二個條件是否有符合,如果符合再依照row_id把完整的資料取出
這樣就大大的減少了random io的存取,進而增加了尋找的效率
另外,如果僅搜尋index的欄位的並且在回傳的時候也只回傳index的欄位時,也可以加速
這個情境比較常使用到一個index有兩個以上欄位的時候使用
user裡面有九筆資料
id | phone | name |
---|---|---|
5 | 0908070605 | user5 |
1 | 0912333555 | user1 |
3 | 0912345678 | user3 |
6 | 0912999888 | user6 |
7 | 0922111333 | user7 |
8 | 0933444555 | user8 |
9 | 0944555666 | user9 |
10 | 0955666777 | user10 |
11 | 0966777888 | user11 |
Index1裡面會是
phone | diskAddress | name |
---|---|---|
0908070605 | 0x13579 | user5 |
0912333555 | 0x12345 | user1 |
0912345678 | 0x56789 | user3 |
0912999888 | 0x11111 | user6 |
0922111333 | 0x22222 | user7 |
0933444555 | 0x33333 | user8 |
0944555666 | 0x44444 | user9 |
0955666777 | 0x55555 | user10 |
0966777888 | 0x66666 | user11 |
此時如果query的語法是
select name, phone from user where phone like '091%';
這時候資料庫在找資料時,就只要找完index後,直接將index的內容直接回傳,就不用再到另一個硬碟的空間,把整列user的資料讀出來
這個尤其在資料表有超級多欄位的時候特別好用,因為這樣就可以減少大量的硬讀random io的讀取次數
Ref
https://use-the-index-luke.com/sql/clustering/index-filter-predicates